Linux 内核参数相关
Table of Contents
1. 修改内核启动参数
1.1. 备份 grub 配置
对于 MBR ( 基于 BIOS ) 的系统:
cp /etc/default/grub /etc/default/grub.backup
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.backup
对于 RedHat 系使用 GPT ( 基于 UEFI ) 的系统:
cp /etc/default/grub /etc/default/grub.backup
cp /boot/efi/EFI/redhat/grub.cfg /boot/efi/EFI/redhat/grub.cfg.backup
对于 Debian 系使用 GPT ( 基于 UEFI ) 的系统:
cp /etc/default/grub /etc/default/grub.backup
cp /boot/efi/EFI/debian/grub.cfg /boot/efi/EFI/debian/grub.cfg.backup
1.2. 更改 grub 配置
编辑 /etc/default/grub 文件。这个文件里有许多的 grub2 配置。
内核启动参数在 GRUB_CMDLINE_LINUX 字段中配置,内容像这样:
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true
改好之后,保存文件,退出。
1.3. 重新生成 grub.cfg 配置文件
1.3.1. RedHat 系
对于 MBR ( 基于 BIOS ) 的系统: grub2-mkconfig -o /boot/grub2/grub.cfg
对于 GPT ( 基于 UEFI ) 的系统: grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
然后重启系统即可使新的配置生效。
1.3.2. Debian 系
执行 sudo update-grub
即可。
然后重启系统即可使新的配置生效。
1.4. 确认新配置生效
在系统启动之后,执行 cat /proc/cmdline
可以查看本次启动所用的内核参数,输出类似于这样:
BOOT_IMAGE=(hd1,gpt2)/vmlinuz-4.18.0-348.7.1.el8_5.x86_64 root=UUID=da00319f-e023-464f-82bf-dd44807e1d2d ro crashkernel=auto rhgb quiet nosgx
2. ACPI 相关
2.1. GPE 引发的报错
GPE (General Purpose Events) 是 ACPI 表中没有预定义的 ACPI 事件。 ls /sys/firmware/acpi/interrupts
可以查看操作系统认到的 GPE。
但修复 GPE 需要改动内核或者更新 BIOS,这都不是普通用户可以完成的。所以,普通用户能做的只有屏蔽这个 GPE。
比如,要解决 L09 这个报错,其含义是水平触发的 (L),在 09 寄存器上的 GPE:
root@r220:~# journalctl | grep _L09 Sep 20 20:08:55 r220 kernel: ACPI BIOS Error (bug): Could not resolve symbol [\_GPE._L09.D1F0], AE_NOT_FOUND (20221020/psargs-330) Sep 20 20:08:55 r220 kernel: No Local Variables are initialized for Method [_L09] Sep 20 20:08:55 r220 kernel: No Arguments are initialized for method [_L09] Sep 20 20:08:55 r220 kernel: ACPI Error: Aborting method \_GPE._L09 due to previous error (AE_NOT_FOUND) (20221020/psparse-529) Sep 20 20:08:55 r220 kernel: ACPI Error: AE_NOT_FOUND, while evaluating GPE method [_L09] (20221020/evgpe-511)
确认操作系统认到了这个 09 寄存器上的 GPE 事件:
# ls -alh /sys/firmware/acpi/interrupts ... -rw-r--r-- 1 root root 4.0K Sep 24 10:28 gpe09 ...
在内核的启动参数中屏蔽这个 GPE 事件:
acpi_mask_gpe=0x09
3. TCP 拥塞控制算法 BBR
linux kernel 4.9 版本加入了 BBR 算法,可以直接通过参数开启:
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
确认当前是否启用:
$ sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_available_congestion_control = reno cubic bbr $ lsmod | grep bbr tcp_bbr 20480 1
4. 禁用 Predictable Network Interface Names
原先,Linux 在驱动检测到网卡之后,将检测到的网卡按顺序命名为 eth0, eth1... 。但由于驱动的加载顺序无法预测,所以当系统中存在多块网卡时,物理网卡很可能在下次系统启动时被分配一个与之前不同的名称。
为了让网卡的名称变得可以被预测,就引入了 Predictable Network Interface Names 这个功能。它自 systemd v197 被引入,可以根据网卡在硬件总线上的位置来给网卡分配一个固定的名称,比如 eno1, ens192, enp2s0f1 这样的名称。
但是,有些设备上,网卡在设备总线上的位置比 PCIe 插槽的位置更靠后。这就导致,如果用户为 PCIe 插槽添加了一个设备,那么下次系统启动之后,网卡的名称会变得和之前不同。因为在设备总线上,网卡之前多出了一个 PCIe 设备,即,网卡设备的排位向后移动了一位。
这种现象并不少见,搜索引擎上可以找到很多案例。用户为设备添加了一块 PCIe 插槽的 NVMe 硬盘,然后启动系统,接着发现 Linux 内核报告找不到对应名字的网卡,用户用 ip address
一查,发现网卡名称变了。
针对这一种情况,Debian 官方给出了一种 使用 systemd.link 根据网卡 mac 地址为网卡命名 的方法。
但如果用户可以接受原先的,按照网卡被检测到的顺序命名的方法的话,最简单的思路是,直接在内核的启动参数中加入 net.ifnames=0 biosdevname=0 来禁用 Predictable Network Interface Names:
# /etc/default/grub GRUB_CMDLINE_LINUX="... net.ifnames=0 biosdevname=0"